package semantico;

import java.util.ArrayList;

import simbolos.Tipo;

/**
 * Implementa atribuicoes com um identificador no lado esquerdo e uma expressao a direita.
 * Exemplo: identificador = expressao.
 * @author Cefanys
 */
public class Atribuicao extends Codigo{

	public Identificador identificador;
	public Expressao expressao;

	public Atribuicao(Identificador identificador, Expressao expressao) throws SemanticoException{
		this.identificador = identificador;
		this.expressao = expressao;

		if(tipoAtribuicao(identificador.tipo, expressao.tipo) == null) montaErro(1, "");;
	}

	/**
	 * Verifica se os tipos de uma atribuicao sao compativeis.
	 * @param op1
	 * @param op2
	 * @return
	 */
	public Tipo tipoAtribuicao(Tipo op1, Tipo op2){
		if(op1 == Tipo.INTEIRO && op2 == Tipo.INTEIRO){
			return Tipo.INTEIRO;
		}else if(op1 == Tipo.LOGICO && op2 == Tipo.LOGICO){
			return Tipo.LOGICO;
		}else{
			return null;
		}
	}
	
	/**
	 * Gera codigo de tres enderecos
	 * @param inicio - marca o inicio do codigo para o comando.
	 * @param primeiraInstrucaoApos - marca a primeira instrucao apos o codigo do comando.
	 * @throws SemanticoException 
	 */
	public void gerar(int inicio, int primeiraInstrucaoApos) throws SemanticoException{
		
		if(expressao instanceof FuncaoExecutarExpressao){
			if (((FuncaoExecutarExpressao)expressao).parametrosFuncao.size() > 0) {
				ArrayList<Expressao> parametrosFuncao = ((FuncaoExecutarExpressao)expressao).parametrosFuncao; 
				for (Expressao expressao : parametrosFuncao) {
					emitirCodigo("param " + expressao.toString());
				}
				emitirCodigo(identificador.toString() + " = rt ( call " + 
						((FuncaoExecutarExpressao)expressao).identificadorFuncao.toString() + 
						", " + parametrosFuncao.size() + ")");
			}else{
				emitirCodigo(identificador.toString() + " = rt ( call " + 
						((FuncaoExecutarExpressao)expressao).identificadorFuncao.toString() + ", 0)");
			}
		}else{
			emitirCodigo(identificador.toString() + " = " + expressao.gerarTermo().toString());
		}
		
	}
}